package com.yupi.yupicturebackend;

import org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication(exclude = {ShardingSphereAutoConfiguration.class})
@EnableAsync
@MapperScan("com.yupi.yupicturebackend.mapper")
@EnableAspectJAutoProxy(exposeProxy = true)
// 是 Spring AOP 中的一个关键注解配置，主要用于启用基于 AspectJ 的自动代理功能，并控制代理对象的暴露行为。以下是详细分析：
//
//核心作用
//  1.启用 AOP 自动代理
//  2.开启 Spring 对 @Aspect 注解的扫描，自动为匹配的 Bean 创建动态代理（JDK 动态代理或 CGLIB）。
//exposeProxy = true 的特殊行为
//  将当前代理对象（AOP 生成的代理）暴露到 AopContext 中，允许通过 AopContext.currentProxy() 在方法内部获取当前代理引用。
//使用场景
//  在 Spring 管理的 Service 实现类（@Service）中，如果对方法添加 @Transactional 注解，Spring 会通过 AOP 为该类生成一个代理对象。
//  默认情况下，直接通过 this.method() 的自调用会绕过代理，导致事务失效。
//  此时，若配置了 @EnableAspectJAutoProxy(exposeProxy = true)，可以通过 AopContext.currentProxy() 获取当前代理对象，
//  再通过代理调用方法，确保事务生效。

public class YuPictureBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(YuPictureBackendApplication.class, args);
    }

}
